package com.zhupf.stack;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author zhupf
 * @date 2024年12月09日 10:21
 * @Description 71. 简化路径
 * 给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为 更加简洁的规范路径。
 * <p>
 * 在 Unix 风格的文件系统中规则如下：
 * <p>
 * 一个点 '.' 表示当前目录本身。
 * 此外，两个点 '..' 表示将目录切换到上一级（指向父目录）。
 * 任意多个连续的斜杠（即，'//' 或 '///'）都被视为单个斜杠 '/'。
 * 任何其他格式的点（例如，'...' 或 '....'）均被视为有效的文件/目录名称。
 * 返回的 简化路径 必须遵循下述格式：
 * <p>
 * 始终以斜杠 '/' 开头。
 * 两个目录名之间必须只有一个斜杠 '/' 。
 * 最后一个目录名（如果存在）不能 以 '/' 结尾。
 * 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
 * 返回简化后得到的 规范路径 。
 */
public class SimplifyPath {
    public static void main(String[] args) {
        System.out.println(simplifyPath("/../"));
    }
    public static String simplifyPath(String path) {
        String[] splits = path.split("/");
        Deque<String> deque = new LinkedList<>();
        for (String split : splits) {
            if("..".equals(split)){
                if(!deque.isEmpty()){
                    deque.pop();
                }
            }else if(!"".equals(split)&&!".".equals(split)){
                deque.push(split);
            }
        }
        String result = "";
        while (!deque.isEmpty()){
            result = "/"+deque.poll()+result;
        }
        return  result.equals("")?"/":result;
    }

    public static String simplifyPath1(String path) {
        String[] split = path.split("/");
        String result = "";
        for (int i = split.length - 1; i > 0; ) {
            if ("".equals(split[i])||".".equals(split[i])) {
                i--;
                continue;
            }
            if ("..".equals(split[i])) {
                int j = 1;
                i--;
                while (j>0 && i>0){
                    if("..".equals(split[i])){
                        j+=2;
                    }
                    if ("".equals(split[i])||".".equals(split[i])) {
                        i--;
                        continue;
                    }
                    j--;
                    i--;
                }
                continue;
            }
            result = "/"+split[i--]+result;
        }
        return  result.equals("")?"/":result;
    }
}
